/* Nama		: Karina Novita Suryani(23512187), Ni Made Satvika Iswari (23512077) */
/* File		: Time.c*/
/* Tanggal 	: 24 September 2012*/

#include "time.h"
#include <stdio.h>

/* Kelompok validasi terhadap type */
int IsValidTime (int H, int M, int S)
/* 	Menuliskan true jika H, M, S dapat membentuk Jam yang valid */
{
	if ((H >= 0) && (H<=23) && (M >= 0) && (M <= 59) &&(S >= 0) && (S <= 59) ){
		return 1;
	} else {
		return 0;
	}
}

/* Konstruktor */
Time MakeTime (int HH, int MM, int SS)
/* 	Membentuk sebuah jam dari komponen-komponennya yang valid */
{
	Time T;
	T.HH = HH;
	T.MM = MM;
	T.SS = SS;
	
	return T;
}
Time MakeTimefromStr(char hour[], char min[], char sec[])
/* 	Membentuk sebuah jam dari komponen-komponennnya yang bertipe string */
{
	/* Kamus Lokal */
	Time T;
	char delims[] = ":";
	char *t;
	char tmp[100];
	int hh, mm, ss;
	
	hh = atoi(hour);
	mm = atoi(min);
	ss = atoi(sec);
	
	T = MakeTime(hh, mm, ss);
	return T;
}

/* Pengubah Nilai Komponen*/
void SetHour (Time *T){
/*proses membaca inputa user untuk mengubah HH*/
/* I.S. Sembarang
   F.S. HH dari T sudah diset
*/
	int h;
	do{
	scanf("Masukkan Nilai Jam yang Baru : %d\n", h);
	} while (!IsValidTime(h,0,0));
	(*T).HH = h;
}

void SetMin (Time *T)
{
/*proses membaca inputa user untuk mengubah MM*/
/* I.S. Sembarang
   F.S. MM dari T sudah diset
*/
	int m;
	do{
	scanf("Masukkan Nilai Menit yang Baru : %d\n", m);
	} while (!IsValidTime(0,m,0));
	(*T).MM = m;
}

void SetSec (Time *T)
{
/*proses membaca inputa user untuk mengubah SS*/
/* I.S. Sembarang
   F.S. SS dari T sudah diset
*/
	int s;
	do{
	scanf("Masukkan Nilai detik yang Baru : %d\n", s);
	} while (!IsValidTime(0,0,s));
	(*T).SS = s;
}

void BacaTime (Time *T)
/*prosedur membaca inputan user untuk membuat T
	I.S -
	F.S T telah terbentuk
*/
{
	int h,m,s;
	do{ 
		printf("    Masukkan HH : ");
		scanf("%d",&h);
		printf("    Masukkan MM : ");
		scanf("%d",&m);
		printf("    Masukkan SS : ");
		scanf("%d",&s);
	} while (!IsValidTime(h,m,s));
	
	*T = MakeTime(h,m,s);
}

void TulisTime (Time T)
/*prosedur menuliskan ke layar isi T
	I.S T is Defined
	F.S T telah terulis di layar
*/
{
	printf("%s\n", TimeToString(T));
	//printf("%d:%d:%d",GetHour(T),GetMinute(T),GetSecond(T));
}

int EqTime (Time T1,Time T2)
/*mengembalikan nilai 1 apabila T1==T2*/
{
	if ((GetHour(T1) == GetHour(T2)) && (GetMinute(T1) == GetMinute(T2)) && (GetSecond(T1) == GetSecond(T2))){
		return 1;
	} else { //T1 != T2
		return 0;
	}
}

int isGreaterThan (Time T1, Time T2)
/*mengembalikan nilai 1 apabila T1 > T2*/
{
	if (GetHour(T1)>GetHour(T2)){
		return 1;
	} else if (GetHour(T1)==GetHour(T2)){
		if (GetMinute(T1)>GetMinute(T2)){
			return 1;
		} else if (GetMinute(T1)==GetMinute(T2)){
			if (GetSecond(T1) > GetSecond(T2)){
				return 1;
			} else { //T1.HH == T2.HH && T1.MM == T2.MM && T1 <= T2.MM
				return 0;
			}
		} else {//T1.HH == T2.HH && T1.MM < T2.MM
			return 0;
		}
	} else{ //T1.HH < T2.HH
		return 0;
	}
}

int isLessThan (Time T1, Time T2)
/*mengembalikan nilai 1 apabila T1 < T2*/
{
	if (GetHour(T1)<GetHour(T2)){
		return 1;
	} else if (GetHour(T1)==GetHour(T2)){
		if (GetMinute(T1)<GetMinute(T2)){
			return 1;
		} else if (GetMinute(T1)==GetMinute(T2)){
			if (GetSecond(T1) < GetSecond(T2)){
				return 1;
			} else { //T1.HH == T2.HH && T1.MM == T2.MM && T1 >= T2.MM
				return 0;
			}
		} else {//T1.HH == T2.HH && T1.MM > T2.MM
			return 0;
		}
	} else{ //T1.HH > T2.HH
		return 0;
	}
}

char* TimeToString(Time T)
/*mengembalikan time dalam format hh:mm:ss */
{
	/* Kamus Lokal */
	char* tmp;
	char* str;
	
	/* Algoritma */
	tmp = (char*) malloc (MAX_CHAR * sizeof(char));
	str = (char*) malloc (MAX_CHAR * sizeof(char));
	
	itoa(GetHour(T), str, 10);
	strcpy(tmp, str);
	strcat(tmp, ":");
	itoa(GetMinute(T), str, 10);
	strcat(tmp, str);
	strcat(tmp, ":");
	itoa(GetSecond(T), str, 10);
	strcat(tmp, str);
	
	return tmp;
}

